/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.br.imovel.controller;

import com.br.imovel.ejb.AvaliacaoEJBLocal;
import com.br.imovel.ejb.PreenchimentoEJBLocal;
import com.br.imovel.ejb.PreenchimentoRespostaEJBLocal;
import com.br.imovel.model.Aluno;
import com.br.imovel.model.Avaliacao;
import com.br.imovel.model.Preenchimento;
import com.br.imovel.model.PreenchimentoResposta;
import com.br.imovel.model.Turma;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 *
 * @author diego
 */
@ManagedBean(name = "preenchimentoM")
@SessionScoped
public class PreenchimentoMBean implements Serializable {

    @EJB
    private PreenchimentoEJBLocal preenchimentoEJB;
    @EJB
    private AvaliacaoEJBLocal avaliacaoEJB;
    @EJB
    private PreenchimentoRespostaEJBLocal preenchimentoRespostaEJBLocal;
    private Aluno aluno;
    private Preenchimento entidade;
    private PreenchimentoResposta entidadeResposta;
    private Preenchimento[] entidadesSelecionadas;
    private DataModel entidades;
    private DataModel entidadesPreenchimento;
    private FacesMessage msg;
    private Logger log;
    private Long avaliacaoId;
    private List<SelectItem> listaAvaliacoes;

    public PreenchimentoResposta getEntidadeResposta() {
        return entidadeResposta;
    }

    public void setEntidadeResposta(PreenchimentoResposta entidadeResposta) {
        this.entidadeResposta = entidadeResposta;
    }

    public Long getAvaliacaoId() {
        return avaliacaoId;
    }

    public void setAvaliacaoId(Long avaliacaoId) {
        this.avaliacaoId = avaliacaoId;
    }

    public DataModel getEntidadesPreenchimento() {

        Avaliacao avaliacao = avaliacaoEJB.recupera(avaliacaoId);
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("avaliacao", avaliacao);
        List<Preenchimento> preenchimentos = preenchimentoEJB.localiza(parametros);


        //List<PreenchimentoResposta> lista = preenchimentoRespostaEJBLocal.recuperaTodos();
        log.trace("getEntidades :" + preenchimentos);
        if (!preenchimentos.isEmpty()) {
            entidadesPreenchimento = new ListDataModel(preenchimentos.get(0).getPreenchimentosRespostas());
        } else {
            entidadesPreenchimento = new ListDataModel(new ArrayList<PreenchimentoResposta>());
        }


        return entidadesPreenchimento;
    }

    public void setEntidadesPreenchimento(DataModel entidadesPreenchimento) {
        this.entidadesPreenchimento = entidadesPreenchimento;
    }

    public List<SelectItem> getListaAvaliacoes() {
        if (listaAvaliacoes == null) {
            listaAvaliacoes = new ArrayList<SelectItem>();
            listaAvaliacoes.add(new SelectItem(null, "Escolha sua Avaliação"));

          
            for (Avaliacao avaliacao : avaliacaoEJB.recuperaTodos()) {
                listaAvaliacoes.add(new SelectItem(avaliacao.getId(), avaliacao.getNome()));
            }
        }
        return listaAvaliacoes;
    }

    public void setListaAvaliacoes(List<SelectItem> listaAvaliacoes) {
        this.listaAvaliacoes = listaAvaliacoes;
    }

    public PreenchimentoMBean() {
        log = Logger.getLogger(PreenchimentoMBean.class);
        BasicConfigurator.configure();
        log.setLevel(Level.ALL);
        log.info("entrou no construtor");
        iniciaDados();
    }

    private void iniciaDados() {

        this.entidades = null;
        this.entidade = new Preenchimento();
        this.entidadeResposta = null;
        this.entidadeResposta = new PreenchimentoResposta();
        //this.entidade = new Avaliacao();
        List<PreenchimentoResposta> preenchimentoResposta = new ArrayList<PreenchimentoResposta>();
        preenchimentoResposta.add(new PreenchimentoResposta());
        this.entidade.setPreenchimentosRespostas(preenchimentoResposta);

        this.entidadesSelecionadas = null;
        log.trace("Limpar dados das  Entidades :");

    }

    public Preenchimento[] getEntidadesSelecionadas() {
        return entidadesSelecionadas;
    }

    public void setEntidadesSelecionadas(Preenchimento[] entidadesSelecionadas) {
        this.entidadesSelecionadas = entidadesSelecionadas;
    }

    public void log(String mensagem, Level level, Exception e) {
        if (level == Level.FATAL) {
            log.fatal(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.ERROR) {
            log.error(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.WARN) {
            log.warn(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.INFO) {
            log.info(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.TRACE) {
            log.trace(System.currentTimeMillis() + mensagem, e);
        }

    }

    public Preenchimento getEntidade() {
        return entidade;
    }

    public void setEntidade(Preenchimento entidade) {
        this.entidade = entidade;
        log.trace("setEntidade:" + entidade);

    }

    public void setEntidadeDuplicar(Preenchimento entidade) {
        this.entidade = entidade;
        this.entidade.setId(null);
        log.trace("setEntidadeDuplicar:" + entidade);

    }

    public DataModel getEntidades() {
        if (entidades == null) {
            List<Preenchimento> lista = preenchimentoEJB.recuperaTodos();
            log.trace("getEntidades :" + lista);
            entidades = new ListDataModel(lista);
        }
        return entidades;
    }

    public void setEntidades(DataModel entidades) {
        this.entidades = entidades;
    }

    public void prepararAdicionarEntidade() {
        this.entidade = new Preenchimento();
        log.info("prepara Adicionar entidade :" + entidade);


    }

    public void prepararDuplicarEntidade() {
        this.entidade.setId(null);
        log.info("prepara Duplicar Entidade :" + entidade);
    }

    public void salvaEntidade() {
        List<PreenchimentoResposta> listaRespostas = new ArrayList<PreenchimentoResposta>();


        for (int i = 0; i < this.entidadesPreenchimento.getRowCount(); i++) {
            this.entidadesPreenchimento.setRowIndex(i);
            listaRespostas.add((PreenchimentoResposta) this.entidadesPreenchimento.getRowData());
        }
        try {
            for (PreenchimentoResposta preenchimentoRespostaF : listaRespostas) {
                preenchimentoRespostaEJBLocal.atualiza(preenchimentoRespostaF);
            }

            empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro salvo com sucesso " + entidade.getId(), null);

        } catch (Exception e) {
            empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro  salvando  " + e.getMessage(), null);
            log.error("Erro  salvando  " + e.getMessage());
        }

        /*

         if (this.getEntidade() != null) {


         if (this.getEntidade().getId() == null) {
         try {
         preenchimentoEJB.novo(entidade);
         empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro salvo com sucesso " + entidade.getId(), null);


         } catch (Exception e) {
         empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro  salvando  " + e.getMessage(), null);
         log.error("Erro  salvando  " + e.getMessage());
         }

         } else {
         try {
         preenchimentoEJB.atualiza(entidade);
         empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro atualizado com sucesso " + entidade.getId(), null);
         } catch (Exception e) {
         empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro  salvando  " + e.getMessage(), null);
         log.error("Erro  salvando  " + e.getMessage());
         }
         }

         limpaDados();
         }
         * */
    }

    public void removerEntidade() {
        log.info("Remover  Entidade :" + entidade);
        preenchimentoEJB.remove(entidade);
        empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro removido com sucesso " + entidade.getId(), null);
        limpaDados();
    }

    public void removerEntidadesSelecionadas() {
        log.trace("Remover  Entidades Selecionadas :" + entidadesSelecionadas);
        empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registros removidos  com sucesso, total de  " + this.entidadesSelecionadas.length, null);
        for (Preenchimento entidadeAtual : entidadesSelecionadas) {
            preenchimentoEJB.remove(entidadeAtual);
        }
        limpaDados();
    }

    private void limpaDados() {

        this.entidades = null;
        this.entidade = new Preenchimento();
        this.entidadesSelecionadas = null;
        log.trace("Limpar dados das  Entidades :");

    }

    private void empilhaMensagem(FacesMessage.Severity tipoMensagem, String titulo, String mensagem) {
        msg = new FacesMessage(tipoMensagem, titulo, mensagem);
        FacesContext.getCurrentInstance().addMessage(null, this.msg);

    }
}
